package com.woniuxy.rabbitmq.baseapi.mq03Subscribe;

/**
 * description: Consumer <br>
 * date: 2022/1/10 5:51 下午 <br>
 * author: shesaifei <br>
 * version: 1.0 <br>
 */

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 生产者发送消息
 */
public class ConsumerSms {
    public static void main(String[] args) throws IOException, TimeoutException {
        //连接工厂：配置连接参数，创建连接对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.13.28");
        //设置虚拟主机：类似于mysql数据库服务器中的一个具体数据库，默认的就是/
        connectionFactory.setVirtualHost("/");
        //消息通信端口
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //连接对象
        Connection connection = connectionFactory.newConnection();
        //连接信道
        Channel channel = connection.createChannel();
        channel.exchangeDeclare("exchangefanout", BuiltinExchangeType.FANOUT);
        /**
         * String queue:      队列的名称
         * boolean durable:   是否是持久化队列 - 如果我们声明一个持久队列，则为真（该队列将在服务器重新启动后继续存在
         * boolean exclusive: 独占(要消费当前队列的消息，必须使用创建这个的连接  false) - 如果我们声明一个独占队列，则为真（仅限于此连接）
         * boolean autoDelete: 是否自动删除(如果我们声明一个自动删除队列，则为 true（服务器将在不再使用时将其删除）)
         *                     自动删除:队列一旦无效，自动删除      false
         * Map<String, Object> arguments: 设置队列属性(队列的其他属性（构造参数)
         */
        channel.queueDeclare("queuesms", true, false, false, null);
        //监听队列，处理消息
        //String queue, 队列名
        // boolean autoAck, true自动确认
        // 自动确认:消费者受到消息，会自动向队列发送确认信息，队列会删除对应的消息
        // 手动确认：实际项目使用手动确认
        // Consumer callback,回调函数，处理消息,定义收到消息要执行的代码
        channel.queueBind("queuesms", "exchangefanout", "");
        channel.basicConsume("queuesms", true,
                new DefaultConsumer(channel) {

                    //String consumerTag, 消费者标记，系统会自动分配
                    //Envelope envelope, 信封，封装和当前消息相关的信息，后面的手动确认要使用
                    // AMQP.BasicProperties properties, 发送消息时指定的附加属性
                    // byte[] body：消息体
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope,
                                               AMQP.BasicProperties properties, byte[] body)
                            throws IOException {
                        System.out.println("处理短息:" + new String(body));
                    }
                });
        //消费者启动后一直监听队列，处理消息，一般不关闭
    }
}
